package com.shiyanlou.fileedit;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dialog;
import java.awt.FileDialog;
import java.awt.FlowLayout;
import java.awt.ScrollPane;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;


public class FileEditor extends JFrame {
	
	// 文件的绝对路径文本域对象
	private JTextField selectField;
	// 文本编辑区对象
	private JTextArea editArea;
	// “保存”按钮
	private JButton saveBtn;
	// “浏览”按钮
	private JButton openFileBtn;
	// 记录目录层次数，默认为0
	private int level=0;
	
	public FileEditor(){
		this.init();
	}
	
	private void init() {
		
		/*
		 * 北边菜单区域
		 * 1.路径输入域
		 * 2.浏览按钮
		 * 3.保存按钮 
		 */
		// 创建 选择框
		selectField = new JTextField(40);
		
		// 创建"浏览"按钮,并为浏览按钮添加监听事件
		openFileBtn = new JButton("浏览");
		openFileBtn.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent ae){
				FileEditor.this.level =0;
				String path = selectField.getText();
				// 浏览目录或文件
				openDirOrFile(path.replace("//", "\\\\"));
				//String的replaceAll()方法，是采用正则表达式规则去匹配的。
				// 参数中的“//”在java语言中被解析为“/”，而“\\\\”在java语言中被解析成“\\”，还要经正则表达式转换为“\”。
			}
		});
		
		// 创建“保存”按钮，并添加监听事件
		saveBtn = new JButton("保存");
		saveBtn.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent ae){
				// 保存
				saveFile();
			}
		});
		
		// 北部菜单画板左对齐主面板
		JPanel upPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
		// 设置北部画板背景颜色
		//upPanel.setBackground(Color.BLUE);
		
		// 加入“选择框”
		upPanel.add(selectField);
		// 加入“浏览”按钮
		upPanel.add(openFileBtn);
		// 加入“保存”按钮
		upPanel.add(saveBtn);
		
		// 将北部菜单添加进主画板，并布局北部
		this.add(upPanel,BorderLayout.NORTH);
		// ----------------------------------------------北部菜单end
		
		/*
		 * 中部 文本编辑区
		 */
		editArea = new JTextArea();
		// 滚动面板
		ScrollPane scrollPanel = new ScrollPane(ScrollPane.SCROLLBARS_AS_NEEDED);
		scrollPanel.add(editArea);
		this.add(scrollPanel, BorderLayout.CENTER);
		
		/*
		 * 面板基础设置
		 */
		// 设置标题
		this.setTitle("记事本v1.0");
		// 设置大小
		this.setBounds(300,50,600,650);
		// 绑定 默认退出
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		// 显示面板
		this.setVisible(true);
		// ---------------------------------------------- 面板基础 end
	}
	
	/*
	 * 保存文件
	 */
	private void saveFile() {
		// 保存弹窗
		FileDialog fd = new FileDialog(this,"保存文件");
		
		// 设置要保存文件的后缀
		fd.setFile("newfile.txt");
		
		// 设置为“保存”模式
		fd.setMode(FileDialog.SAVE);
		fd.setVisible(true);
		
		// 获取文件名
		String fileName = fd.getFile();
		
		// 获取对话框的当前目录
		String dir = fd.getDirectory();
		
		// 根据目录名、文件名创建文件
		File newFiel = new File(dir+File.separator+fileName);
		PrintWriter pw = null;
		try {
			pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream(newFiel)));
			
			String str = editArea.getText();
			pw.println(str);
			pw.flush();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} finally{
			pw.close();
		}
	}
	
	/*
	 * 打开目录或文件
	 */
	private void openDirOrFile(String absolutePath) {
		// absolutePath:指定目录或文件的绝对路径名
		File file = new File(absolutePath);
		
		// 判断文件或目录是否存在
		if(!(file.exists())){
			editArea.setText("文件不存在!");
		// 判断是否是一个目录
		} else if(file.isDirectory()){
			editArea.setText(null);
			// 调用“浏览”
			showDir(file);
		// 判断是否是文件
		} else if(file.isFile()){
			try {
				FileInputStream fis = new FileInputStream(file);
				BufferedReader br = new BufferedReader(new InputStreamReader(fis));
				
				String str = null;
				editArea.setText(null);
					while((str = br.readLine()) != null){
						editArea.append(str + "\r\n");
					}
					br.close();
			} catch (IOException e) {
					e.printStackTrace();
			}
		}
		
	}
	
	/*
	 * 浏览目录，建立树形图
	 */
	private void showDir(File directory) {
		File[] files = directory.listFiles();
		int len = files.length;
		for(int i=0;i<len;i++){
			if(files[i].isDirectory()){
				for(int j=0; j < this.level; j++){
					editArea.append(" ");
				}
				editArea.append("|-- " + files[i].getName() + "(Folder)\r\n");
				this.level++;
				showDir(files[i]);
				this.level--;
			} else if(files[i].isFile()){
				for(int j = 0; j< this.level;j++){
					editArea.append("  ");
				}
				editArea.append("|-- " + files[i].getAbsolutePath() + "\r\n");
			}
		}
	}
	
	/*
	 * 测试
	 */
	public static void main(String[] args) {
		new FileEditor();
	}
}
